/*
 * Clase destinada a representar el registro histórico de aperturas
 * y cierres de las mesas
 */
package grest.model;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.util.Calendar;
import java.util.Date.*;
import java.util.List;
/**
 *
 * @author Santiago, Agustín, Rodrigo
 */
public class MovimientoMesa implements Entidad {
    private int idMovimiento;
    private Date fechaApertura;
    private Time horaApertura;
    private Date fechaCierre;
    private Time horaCierre;
    private int cantPersonas;
    private int nroReserva;
    private boolean modificado;
    private boolean prechanged=false;   
    
    //**********Constructores de la clase
    public MovimientoMesa()
    {
        this(1,1);
    }
    public MovimientoMesa(int cantComen,int nroReserv){
        this(new Date(Calendar.YEAR,Calendar.MONTH,Calendar.DATE),new Time(Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND),cantComen,nroReserv);
    }
    public MovimientoMesa(Date fApert,Time tApert,int cantComen,int nroReserv){
           this(0,fApert,tApert,null,null,cantComen,nroReserv);
    }
    public MovimientoMesa(ResultSet q) throws SQLException{
        this(q.getInt("ID_MOVIMIENTO"),q.getDate("FECHA_APERTURA"),q.getTime("HORA_APERTURA"),
                q.getDate("FECHA_CIERRE"),q.getTime("HORA_CIERRE"),
                q.getInt("CANT_PERSONAS"),q.getInt("NRO_RESERVA"));
        
    }
    public MovimientoMesa(int id,Date fApert,Time tApert, Date fCierre,Time hCierre, int cantComen,int nroReserv){
        setId(id);
        setFechaApertura(fApert);        
        setHoraApertura(tApert);
        setFechaCierre(fCierre);
        setHoraCierre(hCierre);
        setCantPersonas(cantComen);
        setNroReserva(nroReserv);
        setChanged(false);
    }
    //*********Getters y Setters
    /**
     * Devuelve el número de movimiento
     * @return int
     */
    public int getIdMovimiento(){
        return idMovimiento;
    }
     /** Devuelve la fecha de apertura de la 
     * mesa
     * @return Date
     */
    public Date getFechaApert(){
        return fechaApertura;
    }
    /**
     * Devuelve la hora de apertura de la mesa
     * @return Time
     */
    public Time getHoraApert(){
        return horaApertura;
    }
     /** Devuelve la fecha de cierre de la 
     * mesa
     * @return Date
     */
    public Date getFechaCierre(){
        return fechaCierre;
    }
    /**
     * Devuelve la hora de cierre de la mesa
     * @return Time
     */
    public Time getHoraCierre(){
        return horaCierre;
    }
    /**
     * Obtiene la cantidad de comensales
     * @return int
     */
    public int getCantComensales(){
        return cantPersonas;
    }
    /**
     * Devuelve el número de reserva correspondiente
     * al movimiento de mesa
     * @return int
     */
    public int getNroReserva(){
        return nroReserva;
    }
    @Override
    public boolean isChanged(){
        return modificado;
    }
    @Override
    public void setChanged(boolean cambio){
        if(!prechanged)modificado=cambio;
    }
    /**
     * 
     */
    public void setId(int id){
        idMovimiento=id;
        setChanged(true);
    }
    /**
     * Establece la fecha de apertura de la mesa
     * @param fecha 
     */
    public void setFechaApertura(Date fecha){
        fechaApertura=fecha;
        setChanged(true);
    }
    /**
     * Establece la hora de apertura de la mesa
     * @param hora 
     */
    public void setHoraApertura(Time hora){
        horaApertura=hora;
        setChanged(true);
    }
    /**
     * Establece la fecha de cierre de la mesa
     * @param fecha 
     */
    public void setFechaCierre(Date fecha){
        fechaCierre=fecha;
        setChanged(true);
    }
    /**
     * Establece la hora de cierre de la mesa
     * @param hora 
     */
    public void setHoraCierre(Time hora){
        horaCierre=hora;
        setChanged(true);
    }
    /**
     * Establece la cantidad de comenzales
     * @param cp
     * @throws SQLException 
     */
    public void setCantPersonas(int cp){
        cantPersonas=cp;
        setChanged(true);   
    }
    /**
     * Establece el nro. de reserva asociado al movimiento
     * @param cp
     * @throws SQLException 
     */
    public void setNroReserva(int cp){
        cantPersonas=cp;
        setChanged(true);   
    }
    @Override
    public boolean isColumnEditable(int col){
           return false;
    }
    @Override
    public int getColumnCount(){
        return 7;
    }
    @Override
    public String getColumnTitle(int c){
        switch(c){
            case 0: return "Nro. Movimiento";
            case 1: return "Fecha de apertura";
            case 2: return "Hora de apertura";
            case 3: return "Fecha de cierre";
            case 4: return "Hora de cierre";
            case 5: return "Cantidad de Comensales";
            case 6: return "Nro. de reserva";
        }
        return null;
    }
    @Override
    public Object getColumnValue(List<Entidad> tipoEntidad, int fila,int columna){
        switch(columna){
            case 0: return ((MovimientoMesa) tipoEntidad.get(fila)).getIdMovimiento();
            case 1: return ((MovimientoMesa) tipoEntidad.get(fila)).getFechaApert();
            case 2: return ((MovimientoMesa) tipoEntidad.get(fila)).getHoraApert();
            case 3: return ((MovimientoMesa) tipoEntidad.get(fila)).getFechaCierre();
            case 4: return ((MovimientoMesa) tipoEntidad.get(fila)).getHoraCierre();
            case 5: return ((MovimientoMesa) tipoEntidad.get(fila)).getCantComensales();
            case 6: return ((MovimientoMesa) tipoEntidad.get(fila)).getNroReserva();                
        }
        return null;
    }
    /**
     * NO IMPLEMENTADO
     * @param tipoEntidad
     * @param fila
     * @param columna
     * @param valor 
     */
    @Override
    public void setColumnValue(List<Entidad> tipoEntidad, int fila,int columna, Object valor){
        switch(columna){
            case 1: 
                ((MovimientoMesa) tipoEntidad.get(fila)).setFechaApertura((Date) valor);
                break;
            case 2: ((MovimientoMesa) tipoEntidad.get(fila)).setHoraApertura((Time) valor);
                break;
            case 3: ((MovimientoMesa) tipoEntidad.get(fila)).setFechaCierre((Date) valor);
                break;
            case 4:((MovimientoMesa) tipoEntidad.get(fila)).setHoraCierre((Time) valor);
                break;
            case 5: 
                ((MovimientoMesa) tipoEntidad.get(fila)).setCantPersonas((Integer) valor);
                break;
            case 6:
                ((MovimientoMesa) tipoEntidad.get(fila)).setNroReserva((Integer) valor);
                        
        }
    }
    @Override
    public void loadTuplas(List<Entidad> tipoEntidad, ResultSet tuplas) throws SQLException{
        tipoEntidad.add(new MovimientoMesa(tuplas));
    }
    @Override
    public String getInsertQuery(){
        return "INSERT INTO T_MOV_MESAS VALUES (" + 
                getIdMovimiento() +","+
                getFechaApert() +","+
                getHoraApert() +","+
                getHoraCierre() +","+
                getCantComensales() +","+
                getNroReserva() +")";
    }
    @Override
    public String getSelectQuery(){
        return "SELECT * FROM T_MOV_MESAS";
    }
    @Override
    public String getUpdateQuery(){
        return "UPDATE T_MOV_MESAS SET"+
                " FECHA_APERTURA=" + getFechaApert() +
                ", HORA_APERTURA=" + getHoraApert() +
                ", FECHA_CIERRE=" + getFechaCierre() +
                ", HORA_CIERRE=" + getHoraCierre() +
                ", CANT_PERSONAS=" + getCantComensales() +
                ", NRO_RESERVA=" + getNroReserva() +
                "WHERE ID_MOVIENTO=" + getIdMovimiento(); 
        
    }
    @Override
    public String getDeleteQuery(){
        return "DELETE FROM T_MOV_MESAS WHERE ID_MOVIMIENTO=" + getIdMovimiento();
    }
    @Override
    public Class getColumnClass(int columna){
        switch(columna){
            case 0: return Integer.class;
            case 1: return Date.class;
            case 2: return Time.class;
            case 3: return Date.class;
            case 4: return Time.class;
            case 5: return Integer.class;
            case 6: return Integer.class;
        }
        return null;
    }

    @Override
    public void setPreChanged(boolean prechanged) {
        this.prechanged=prechanged;
    }

    @Override
    public boolean isPreChanged() {
        return this.prechanged;
    }

    @Override
    public String onPreInsertQuery() {
        throw new UnsupportedOperationException("No soportado");
    }

    @Override
    public void setID(Object id) {
        throw new UnsupportedOperationException("No soportado");
    }
}

